简书链接:第五篇objectcproperty的理解
文章字数:980,阅读全文大约需要3分钟

  1. 官方的age get方法 的age,和set方法的setAge 实现后就可以直接调用 obj.age=11 或者int avlue=obj.age分别进行设置和取值. 这是开发工具的语法糖之一. 在这了解的基础上才进一步了解@property语法糖就比较容易了
    具体代码
    1
    2
    3
    -(void)setAge:(int) age;
    -(int)age;//getAge();

  2. @property int age实现了get, set代码 代码看不到,但是代码依然可以用,访问属性依然是私有的.只不过实现了get, set方法
  3. @property int age实现的内部代码大概是这样的
    set方法-(void)setAge:(int )agearg -(int) age; get方法
  4. @property 原先是需要在声明文件里面再写上synthesize age;
  5. @property int age等于 @property int age+synthesize age;
  6. @property int age;如果属性不存在则自动创建 所以也等于 一个 age的字段的定义以及get和set的声明,以后的xcode版本还携带了实现.原来是加上synthesize才算实现的,现在全可有可无,变成了语法糖.
  7. 可以给_age字段自动绑定setAge而非set_age写法是先在声明文件定义_age以及在声明文件 括号外面写@property int age
    然后在实现写成synthesize age=_age也就是左边代表方法右边代表真实的字段.
  8. 可以同时给多个字段赋值,如 @property int age,no,sex;
  9. 如果声明文件没有写@synthesize xxx那么如age会创建出一个_age的成员属性.而不是age,也就是只能self.age调用方法,而直接_age是访问字段.
  10. 不存在的字段也可以通过synthesize age=创建,奇葩了 个人感觉语法糖会让人迷惑,成为面试官变态的手段.

撸代码

声明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/  第一个oc程序
//
// Created by aaa on 2018/10/6.
// Copyright © 2018年 cn.qssq666. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface MyPropertie : NSObject

{
int _value5;
}
@property int value1;//没有定义synthesize 也能访问
@property int value2;//没有定义synthesize 也能访问
@property int value3;//没有定义synthesize 也能访问
@property int value4;
@property int value5;
-(void)test;

@end

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//
// MyPropertie.m
// 第一个oc程序
//
// Created by aaa on 2018/10/6.
// Copyright © 2018年 cn.qssq666. All rights reserved.
//

#import "MyPropertie.h"

@implementation MyPropertie


@synthesize value2;
//@synthesize _valuexxx=myvalue3;//声明中没有 _valuexxx
@synthesize value4=valuexxx;//不存在的字段

@synthesize value3;
@synthesize value5=_value5;
//@synthesize noexist;//必须有定义property 才能使用
//@synthesize myvalue3=_value3;//右边代表新的值
-(void)test{
int valueany=valuexxx;
int value3= [self value3];
int value4=[self value4];
NSLog(@"value 1 %d value 2 %d value3 %d value 4 %d value 5 %d getvalue5 %d, value any %d ",self.value1,self.value2,self.value3,self.value4,_value5,self.value5,valuexxx);
// value3
}
@end
//
// MyPropertie.m
// 第一个oc程序
//
// Created by aaa on 2018/10/6.
// Copyright © 2018年 cn.qssq666. All rights reserved.
//

#import "MyPropertie.h"

@implementation MyPropertie


@synthesize value2;
//@synthesize _valuexxx=myvalue3;//声明中没有 _valuexxx
@synthesize value4=valuexxx;//不存在的字段

@synthesize value3;
@synthesize value5=_value5;
//@synthesize noexist;//必须有定义property 才能使用
//@synthesize myvalue3=_value3;//右边代表新的值
-(void)test{
int valueany=valuexxx;
int value3= [self value3];
int value4=[self value4];
NSLog(@"value 1 %d value 2 %d value3 %d value 4 %d value 5 %d getvalue5 %d, value any %d ",self.value1,self.value2,self.value3,self.value4,_value5,self.value5,valuexxx);
// value3
}
@end

测试代码

1
2
3
4
5
6
7
8

MyPropertie *properties= [[MyPropertie alloc] init];
properties.value1=1111;
properties.value2=2222;
properties.value3=33333;
properties.value5=555555;
properties.value4=444;
[ properties test];

image.png

从结果可以得出结论,不存在的对象,也能创建出来,并进行访问.也能看出来可以给方法起别名.

思考

  1. property不过是语法糖而已,采取的方式和别的语言不同,java中其实get ,set都可以通过快捷键生成,另外也没必要写声明,直接写实现就ok,
  2. c# 的语法 set; get;也可以实现,也不需要几份代码
  3. 我觉得把对象的访问的[]的通过工具创造语法糖,用.或者箭头实现对象访问, 也就是改成传统语言的,然后把开发工具优化一下也许会更好.刚开始被这种语法吓到了,感觉无法理解,虽然现在也理解了,但是有点吓人的.

    高级用法

    @property(nonatomic,weak)
    https://blog.csdn.net/aa19920630/article/details/43562043